/**
 * @Author       : Mo 2427995270@qq.com
 * @Date         : 2025-08-14 18:14:40
 * @LastEditTime : 2025-08-16 21:01:54
 * @FilePath     : \ZN-1000-BL\mobl\libs\moblota.h
 * @Description  : mobl ota协议
 * @Version      : V1.0
 * @History      :
 * @Note         :
 */
#ifndef __moblota_H__
#define __moblota_H__

/***************************************Includes***********************************/
// clang-format off
#include <stdint.h>
#include "os_config.h"

#if (USE_OS == OS_FREERTOS) || (USE_OS == OS_NONE)
#include "hal_uart.h"
#elif USE_OS == OS_PTHREAD
#include "serial_port.h"
#endif

// clang-format on

/*************************************Public Macros********************************/
// #define

#if USE_OS == OS_PTHREAD
#define uart_hal_t serial_port_t
#endif // __serial_port_H__

/***********************************Public Statement*******************************/

typedef enum {
    MOBLOTA_EVENT_ENTERBOOT,
    MOBLOTA_EVENT_FILENAME,
    MOBLOTA_EVENT_FILESIZE,
    MOBLOTA_EVENT_FILEDATA,
    MOBLOTA_EVENT_FILEEND,
    MOBLOTA_EVENT_ENTERAPP,
    MOBLOTA_EVENT_GETBOOTVER,
    MOBLOTA_EVENT_GETAPPVER,
    MOBLOTA_EVENT_HEARBEAT,
} moblota_event_t;

struct moblota;
typedef struct moblota moblota_t;

/**
 * @brief 事件回调
 * @return 0成功 -1失败
 * @note null
 */
typedef int (*moblota_event_cb_t)(moblota_t *mot, moblota_event_t event, void *buf, int len);

struct moblota {
    uart_hal_t *uart;
    uint8_t master;        // 主机标志
    uint8_t boot;          // 固件中
    char bootver[16];      // 固件版本
    char appver[16];       // app版本
    uint32_t file_size;    // 文件大小
    uint16_t timeout;      // 超时时间 ms
    moblota_event_cb_t cb; // 事件回调
};


/***********************************Public Functions*******************************/

/**
 * @brief mobl ota初始化
 * @param  mot              
 * @param  uart             串口句柄
 * @param  cb               事件回调
 * @param  boot             1固件 0app
 * @note null
 */
void moblota_init(moblota_t *mot, uart_hal_t *uart, moblota_event_cb_t cb, uint8_t boot);
/**
 * @brief 设置模式
 * @param  mot
 * @param  master           1主机 0从机
 * @note null
 */
void moblota_set_mode(moblota_t *mot, uint8_t master);
/**
 * @brief 设置固件版本
 * @param  mot              
 * @param  ver              "x.xxxx.xxxx"
 * @note 主机询问时需要
 */
void moblota_set_bootver(moblota_t *mot, char *ver);
/**
 * @brief 设置app版本
 * @param  mot              
 * @param  ver              "x.xxxx.xxxx"
 * @note 主机询问时需要
 */
void moblota_set_appver(moblota_t *mot, char *ver);
/**
 * @brief 设置超时 ms
 * @param  mot              
 * @param  timeout          
 * @note null
 */
void moblota_set_timeout(moblota_t *mot, uint16_t timeout);
/**
 * @brief 进入固件
 * @param  mot              
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_enter_boot(moblota_t *mot);
/**
 * @brief 进入app
 * @param  mot              
 * @return int 0成功 -1失败
 * @note 仅取消传输时发送，不发，boot空闲10秒也会进入app
 */
int moblota_enter_app(moblota_t *mot);
/**
 * @brief 检验文件名
 * @param  mot              
 * @param  name             长度不超过17
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_check_file_name(moblota_t *mot, const char *name);
/**
 * @brief 校验文件大小
 * @param  mot              
 * @param  size             
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_check_file_size(moblota_t *mot, uint32_t size);
/**
 * @brief 传输数据
 * @param  mot              
 * @param  buf              数据
 * @param  len              数据长度 max 508
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_transfer_data(moblota_t *mot, void *buf, int len);
/**
 * @brief 传输结束
 * @param  mot              
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_transfer_end(moblota_t *mot);
/**
 * @brief 获取固件版本
 * @param  mot              
 * @param  bootver          
 * @return int 0成功 -1失败
 * @note 询问从机
 */
int moblota_get_bootver(moblota_t *mot, char bootver[16]);
/**
 * @brief 获取app版本
 * @param  mot              
 * @param  appver           
 * @return int 0成功 -1失败
 * @note 询问从机
 */
int moblota_get_appver(moblota_t *mot, char appver[16]);
/**
 * @brief 发送心跳
 * @param  mot              
 * @return int 0成功 -1失败
 * @note null
 */
int moblota_heartbeat(moblota_t *mot);
/**
 * @brief 应答进入固件ok
 * @param  mot              
 * @note null
 */
void moblota_enter_bootok(moblota_t *mot);
/**
 * @brief 应答进入appok
 * @param  mot              
 * @note null
 */
void moblota_enter_appok(moblota_t *mot);
/**
 * @brief 解析接收到的数据
 * @param  mot              
 * @param  buf              数据
 * @param  len              数据长度
 * @note null
 */
void moblota_analysis(moblota_t *mot, void *buf, int len);

/************************** ********Public Variables************************** ****/


#endif
/* [] END OF FILE */
